package net.uzen.office.account;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.uzen.office.account.model.Account;
import net.uzen.office.account.service.AccountService;
import net.uzen.office.common.UzenOfficeConstants;
import net.uzen.office.common.controller.BaseController;
import net.uzen.office.common.exception.SignInException;
import net.uzen.office.common.model.SessionInfo;
import net.uzen.office.common.util.SessionUtil;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;

public class AccountController extends BaseController {

	private static final Log logger = LogFactory
			.getLog(AccountController.class);

	private AccountService accountService;

	public void setAccountService(AccountService accountService) {
		this.accountService = accountService;
	}

	public ModelAndView signInPage(HttpServletRequest request,
			HttpServletResponse response, Account account) {
		logger.debug(">> signInPage ");
		logger.debug(account.toString());

		ModelAndView mav = new ModelAndView("account/signInPage");
		mav.addObject("account", account);
		return mav;
	}

	public void signIn(HttpServletRequest request,
			HttpServletResponse response, Account account) throws Exception {

		logger.debug(">> signIn ");
		logger.debug(">> " + account.toString());
		// 로그인 시도를 하고,
		// 세션 정보를 등록한다.
		// 로그인 시 요청했던 주소가 있다면, 해당 주소로 리디렉션하고, 아니라면 메인 페이지로 이동한다.

		// 세션 정보를 등록한다.
		try {
			SessionUtil.setSessionInfo(request, accountService.signIn(account));
		} catch (SignInException e) {
			// TODO : 예외 처리 또는 폼 관련 컨트롤러로 변경, 예외 처리와 더불어 로그 인 폼으로 이동
			response.sendRedirect(request.getContextPath()
					+ UzenOfficeConstants.SIGN_IN_PAGE);
		} catch (Exception e) {

		}

		// 로그인 시 요청했던 주소가 있다면, 해당 주소로 리디렉션하고, 아니라면 메인 페이지로 이동한다.
		if (StringUtils.isNotEmpty(account.getReturnUrl())) {
			response.sendRedirect(account.getReturnUrl());
		} else {
			response.sendRedirect(request.getContextPath()
					+ UzenOfficeConstants.MAIN_PAGE);
		}
	}

	public ModelAndView signOut(HttpServletRequest request,
			HttpServletResponse response) {
		// 로그 아웃 시간을 기록한다.
		// 세션을 비우고, 로그 인 페이지로 이동한다.

		// 세션 정보를 가져온다.
		SessionInfo sessionInfo = SessionUtil.getSessionInfo(request);

		// TODO : 세션 정보가 없을 때에는 에러를 던진다.
		// 지금은 로그인 페이지로 이동하도록 처리한다.
		if (sessionInfo == null) {
			try {
				response.sendRedirect(request.getContextPath()
						+ UzenOfficeConstants.SIGN_IN_PAGE);
			} catch (Exception e) {

			}
			return null;
		}

		// 로그 아웃 시간을 기록한다.
		Account accountInfo = new Account();
		accountInfo.setMemberID(sessionInfo.getMemberID());
		// accountService.signOut(accountInfo);

		// 세션을 비운다.
		SessionUtil.invalidateSession(request);

		// 로그 인 페이지로 이동한다.
		try {
			response.sendRedirect(request.getContextPath()
					+ UzenOfficeConstants.SIGN_IN_PAGE);
		} catch (Exception e) {

		}
		return null;
	}

}
